/**
 * @description  : emp 平台api适配
 * @descriptionDetail : emp 平台api适配
 * @copyright    : 海南烟草
 * @author       : mc
 * @create       : 2023-11-10 16:32:17
 */
import * as EXIF from "exif-js";
import {isEmpApp} from "../common/util";
import deepClone from "@/uview-ui/libs/function/deepClone";

let empApi;

if (window.emp) {
	console.log('window.', window.emp)
	empApi = window.emp
}

let EMPAPP = {

	/**
	 * 企微鉴权
	 * @param {*} resData
	 * @returns
	 */
	empLogin(usertoken, token) {
		return new Promise((resolve, reject) => {
			if (!usertoken && !token) {
				reject("缺失agentId或者免登陆授权码");
			}
			// 获取用户信息
			const params = {
				usertoken: usertoken,
				token: token
			}
			console.log('url', window.location.href)
			anyPortal.ready(params, function() {
				console.log('------', '---')
				anyPortal.getAccountInfo(params, {
					onSuccess: function(userInfo) {
						console.log("userInfo------", userInfo);
						resolve(userInfo);
					},
					onFail: (err) => {
						console.log("err", err);
						alert(err);
					},
				});
			})
		});
	},

	isHideNav: () => {
		return isEmpApp();
	},

	/**
	 * 设置头部标题
	 * @param {Object}
	 */
	setTitle(text) {
		empApi.window.setTitle({
			title: {
				text: text
			}
		});
	},

	/**
	 * 获取设备信息
	 * @returns Promise
	 */
	device() {
		return new Promise((resolve, reject) => {
			uni.getSystemInfo({
				success: function(res) {
					let data = {
						brand: res.brand,
						model: res.model,
						pixelRatio: res.pixelRatio,
						screenWidth: res.screenWidth,
						screenHeight: res.screenHeight,
						system: res.system,
						platform: res.platform,
					};
					resolve(data);
				},
				fail(e) {
					reject(e);
				},
			});
		});
	},
	/**
	 * 获取当前的地理位置、速度
	 * @param {Object} type  wgs84返回gps 坐标，gcj02返回国测局坐标
	 */
	geolocation(type) {
		return new Promise(function(resolve, reject) {
			empApi.getLocation({
				type: type || 'gcj02', // 默认为wgs84的gps坐标系,可选bd09的百度坐标系和gcj02的火星坐标系
				success: function(res) {
					resolve(res);
				},
				error: function(error) {
					reject(error);
				}
			})
		});
	},
	/**
	 * 打开指定位置
	 * @param {*} latitude     	纬度
	 * @param {*} longitude   	经度
	 * @param {*} address   		地址/POI名称
	 * @param {*} name   		 		位置名
	 * @param {*} scale					地图缩放级别,整形值,范围从1~28。默认为最大 百度地图在手机上当前可使用的级别为3-21级
	 */
	navigateMap(latitude, longitude, address, name = "", scale = 24) {
		// 这里文档上是 wx.openLocation 先改成emp.openLocation
		empApi.openLocation({
			latitude,
			longitude,
			name,
			address,
			scale,
			type: 'gcj02',
		});
	},

	/**
	 * 导航
	 * @param {*} latitude     	纬度
	 * @param {*} longitude   	经度
	 * @param {*} address   	地址/POI名称
	 * @param {*} name   		位置名
	 * @param {*} scale			地图缩放级别,整形值,范围从1~28。默认为最大 百度地图在手机上当前可使用的级别为3-21级
	 */
	startThirdMap(latitude, longitude, address, name = "", scale = 24) {
		empApi.map.startThirdMap({
			provider: "androidamap", // 地图厂商 baidumap:百度地图 androidamap:高德地图  不传provider则手动选择手机中安装的地图（限百度地图、高德地图）
			lat: latitude, //纬度  火星坐标系
			lng: longitude, //经度  火星坐标系
			name: address,//标记点名称
			error: function(res) {

			}
		});
	},
	/**
	 * 复制到剪切板
	 * @param {*} data     	剪贴板的内容
	 */
	clipboardData(data, callback) {
		uni.setClipboardData({
			data,
			success: (result) => callback(true),
			fail: (err) => callback(false)
		});
	},
	/**
	 * emp提示
	 * @param {*} msg     提示信息
	 * @param {*} title   标题(可选)
	 */
	alert(msg, title, success) {
		uni.showModal({
			title: title || "提示",
			content: msg,
			confirmText: "确定",
			success: function(res) {
				if (res.confirm) {
					success && success();
				}
			},
		});
	},
	/**
	 * emp toast弹窗
	 */
	toast(str) {
		uni.showToast({
			title: str,
		});
	},
	/**
	 * 从本地相册选择图片或使用相机拍照
	 * @param {Object} maxSize 最多可以选择的图片张数，默认   1
	 */
	chooseImage(maxSize) {
		return new Promise(function(resolve, reject) {
			empApi.chooseImage({
				count: maxSize ? maxSize : 1, // 默认1
				sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图，默认二者都有
				sourceType: ["album", "camera"], // 从相册选择或者拍照
				defaultCameraMode: 'normal',
				isSaveToAlbum: 1,
				success: function(res) {
					empApi.getLocalImgData({
						'localId': res.localIds[0],
						success: function (res) {
							if (res) {
								var localData = res.localData;
								resolve([localData])
							}
						},
						error: function(error) {
							reject(error);
						}
					})
				},
				fail(e) {
					reject(e);
				},
			});
		});
	},

	/**
	 * 从本地相册选择图片或使用相机拍照 获取base64
	 * @param {Object} maxSize 最多可以选择的图片张数，默认   1
	 */
	chooseImageToBase64(maxSize) {
		return new Promise(function(resolve, reject) {
			// uni.chooseImage({
			// 	count: maxSize ? maxSize : 1, // 默认1
			// 	sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图，默认二者都有
			// 	sourceType: ["album", "camera"], // 从相册选择或者拍照
			// 	defaultCameraMode: 'normal',
			// 	isSaveToAlbum: 1,
			// 	success: function(res) {
			// 		Promise.all(res.tempFilePaths.map((itm) => pathToBase64(itm)))
			// 			.then((dta) => {
			// 				resolve(dta);
			// 			})
			// 			.catch((err) => {
			// 				reject(err);
			// 			});
			// 	},
			// 	fail(e) {
			// 		reject(e);
			// 	},
			// });
			empApi.chooseImage({
				count: maxSize ? maxSize : 1, // 默认1
				sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图，默认二者都有
				sourceType: ["album", "camera"], // 从相册选择或者拍照
				defaultCameraMode: 'normal',
				isSaveToAlbum: 1,
				success: function(res) {
					empApi.getLocalImgData({
						'localId': res.localIds[0],
						success: function (res) {
							if (res) {
								var localData = res.localData;
								resolve([localData])
							}
						},
						error: function(error) {
							console.log('error', error.substring(0, 120))
							reject(error);
						}
					})
				},
				fail(e) {
					reject(e);
				},
			});
		});
	},

	/**
	 * 图片旋转角度
	 */
	changeImgOrientation(resImg, Orientation) {
		return new Promise((resolve, reject) => {
			let self = this;
			let img = new Image();
			img.src = resImg;
			img.onload = function() {
				let canvas = document.createElement("canvas");
				let ctx = canvas.getContext("2d");
				let imgWidth = (canvas.width = this.width);
				let imgHeight = (canvas.height = this.height);
				// 如果方向角不为1，都需要进行旋转 added by lzk
				if (Orientation && Orientation != 1) {
					switch (Orientation) {
						case 6: // 旋转90度
							canvas.width = this.height;
							canvas.height = this.width;
							ctx.rotate(Math.PI / 2);
							ctx.drawImage(this, 0, -imgHeight, imgWidth, imgHeight);
							break;
						case 3: // 旋转180度
							ctx.rotate(Math.PI);
							ctx.drawImage(this, -imgWidth, -imgHeight, imgWidth, imgHeight);
							break;
						case 8: // 旋转-90度
							canvas.width = imgHeight;
							canvas.height = imgWidth;
							ctx.rotate((3 * Math.PI) / 2);
							ctx.drawImage(this, -imgWidth, 0, imgWidth, imgHeight);
							break;
					}
				} else {
					ctx.drawImage(this, 0, 0, imgWidth, imgHeight);
				}
				let base64code = canvas.toDataURL("image/jpeg");
				resolve(base64code);
			};
		});
	},

	/**
	 * 从本地相册选择图片或使用相机拍照
	 * @param {Object} maxSize 最多可以选择的图片张数，默认   1
	 * @param {Int} sType 0 默认，1 相册 ， 2 拍照
	 * @param {Number} quality   0-1
	 * @param {Number} widthScale 0-1
	 * @param {String} enableVide 'false'
	 */
	chooseImageToCompress({
							  maxSize = 1,
							  sType = 0,
							  quality = 0.65,
							  widthScale = 1,
						  }) {
		return new Promise((resolve, reject) => {
			empApi.chooseImage({
				count: maxSize ? maxSize : 1, // 默认1
				sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图，默认二者都有
				sourceType: ["album", "camera"], // 从相册选择或者拍照
				defaultCameraMode: 'normal',
				isSaveToAlbum: 1,
				success: function(res) {
					empApi.getLocalImgData({
						'localId': res.localIds[0],
						success: function (res) {
							if (res) {
								var localData = res.localData;
								resolve([localData])
							}
						},
						error: function(error) {
							console.log('error', error.substring(0, 120))
							reject(error);
						}
					})
				},
				fail(e) {
					reject(e);
				},
			});
		});
	},
	toNum(a) {
		a = a.toString();
		let c = a.split(".");
		let num_place = ["", "0", "00", "000", "0000"];
		let r = num_place.reverse();
		for (let i = 0; i < c.length; i++) {
			let len = c[i].length;
			c[i] = r[len] + c[i];
		}
		let res = c.join("");
		return res;
	},
	getImgByteSize(data) {
		if (data && data.graphicContents) {
			// 获取base64图片byte大小
			const equalIndex = data.graphicContents.indexOf("="); // 获取=号下标
			if (equalIndex > 0) {
				const str = data.graphicContents.substring(0, equalIndex); // 去除=号
				data.size = str.length;
			} else {
				const strLength = data.graphicContents.length;
				data.size = strLength;
			}
		} else {
			data.size = null;
		}
	},
	/**
	 * 图片压缩
	 */
	compressImage(
		file,
		fileExtra,
		num,
		quality = 0.3,
		widthScale = 0.8,
		isApple = false
	) {
		return new Promise((resolve, reject) => {
			let img = new Image();
			img.src = file;
			img.onload = function() {
				let newBase64 = ImageScale.compressImage(img, {
					// 压缩质量
					quality: quality,
					mime: "image/jpeg",
					// 压缩时的放大系数，默认为1，如果增大，代表图像的尺寸会变大(最大不会超过原图)
					compressScaleRatio: 1,
					// ios的iPhone下主动放大一定系数以解决分辨率过小的模糊问题
					iphoneFixedRatio: 1,
					// 是否采用原图像素（不会改变大小）
					isUseOriginSize: false,
					// 增加最大宽度，增加后最大不会超过这个宽度
					maxWidth: 0,
					// 使用强制的宽度，如果使用，其它宽高比系数都会失效，默认整图使用这个宽度
					forceWidth: img.width * widthScale,
					// 同上，但是一般不建议设置，因为很可能会改变宽高比导致拉升，特殊场景下使用
					forceHeight: 0,
				});
				resolve(newBase64);
			};
		});
	},
	/**
	 * 预览图片
	 * @param {Object} urls 需要预览的图片链接列表
	 */
	previewImage(urls, current) {
		return new Promise(function(resolve, reject) {
			empApi.previewImage({
				urls: urls, // 需要预览的图片链接列表
				current: current, // 当前图片链接
				success: function(res) {
					resolve(true);
				},
				error: function(res) {
					reject(false);
				},
			});
		});
	},

	/**
	 * 获取网络类型
	 * wifi	wifi 网络
	 * 2g	2g 网络
	 * 3g	3g 网络
	 * 4g	4g 网络
	 * ethernet	有线网络	App
	 * unknown	Android 下不常见的网络类型
	 * none	无网络
	 * @param {Object} success
	 * @param {Object} fail
	 */
	getNetworkType() {
		return new Promise(function(resolve, reject) {
			empApi.getNetworkType({
				success: function(res) {
					resolve(res.networkType);
				},
				error: function(res) {
					reject(false);
				},
			})
		});
	},

	/**
	 * 拨打电话
	 * @param {Object} phoneNumber
	 */
	makePhoneCall(phoneNumber) {
		return new Promise(function(resolve, reject) {
			uni.makePhoneCall({
				phoneNumber: phoneNumber,
				success: () => {
					resolve(true);
				},
				fail() {
					reject(false);
				},
			});
		});
	},
	/**
	 * 扫码二者都有
	 */
	scan() {
		return new Promise(function(resolve, reject) {
			empApi.scanQRCode({
				needResult: 1, // 默认为0，扫描结果由企业微信处理，1则直接返回扫描结果，
				scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码（一维码），默认二者都有
				success: function(res) {
					// 回调
					let barcode = res.resultStr; // 当needResult为1时返回处理结果
					if (barcode.indexOf("许可证号") >= 0) {
						let start = barcode.indexOf("许可证号") + 5;
						console.log("获取的二维码 start：" + start);
						barcode = barcode.substring(start, start + 12);
						barcode = barcode.replace(/(^\s*)|(\s*$)/g, "");
						console.log("获取的二维码 licCode：" + barcode);
					}
					resolve(barcode);
				},
				error: function(res) {
					if (res.errMsg.indexOf("function_not_exist") > 0) {
						alert("版本过低请升级");
					}
					reject(res.errMsg);
				},
			});
		});
	},
	/**
	 * 调起条码扫描
	 */
	barCode() {
		return new Promise(function(resolve, reject) {
			empApi.scanQRCode({
				needResult: 1, // 默认为0，扫描结果由企业微信处理，1则直接返回扫描结果，
				scanType: ["barCode"], // 可以指定扫二维码还是条形码（一维码），默认二者都有
				success: function(res) {
					// 回调
					let barcode = res.resultStr; // 当needResult为1时返回处理结果
					if (barcode.indexOf("许可证号：") >= 0) {
						let start = barcode.indexOf("许可证号：") + 5;
						console.log("获取的二维码 start：" + start);
						barcode = barcode.substring(start, start + 13);
						barcode = barcode.replace(/(^\s*)|(\s*$)/g, "");
						console.log("获取的二维码 licCode：" + barcode);
					}
					resolve(barcode);
				},
				error: function(res) {
					if (res.errMsg.indexOf("function_not_exist") > 0) {
						alert("版本过低请升级");
					}
					reject(res.errMsg);
				},
			});
		});
	},
	/**
	 *  提示框
	 * @param String title 标题
	 * @param String content 提示类容
	 * @param String confirmText 确定按钮文字
	 * @param Boolean showCancel 是否显示取消按钮
	 * @param String cancelText 取消按钮文字
	 * @param {Object} success
	 * @param {Object} fail
	 */
	showModal(
		title,
		content,
		confirmText,
		showCancel,
		cancelText,
		success,
		cancel
	) {
		uni.showModal({
			title: title,
			content: content,
			confirmText: confirmText,
			showCancel: showCancel,
			cancelText: cancelText,
			success: function(res) {
				if (res.confirm) {
					success();
				} else if (res.cancel) {
					cancel();
				}
			},
		});
	},

	/**
	 * 显示操作菜单
	 * @param {Object} title 标题 不需要传：""
	 * @param {Object} actionbuttons 操作菜单 [{title:"不同意",style:"destructive"},{title:"1"},{title:"2"},{title:"3"}]
	 * @param {Object} cancelText 取消按钮文字
	 * @param {Object} success 成功回调
	 */
	showActionSheet(title, actionbuttons, cancelText, success) {
		// #ifdef APP-PLUS
		let actionstyle = {
			title: title,
			cancel: cancelText,
			buttons: actionbuttons,
		};
		plus.nativeUI.actionSheet(actionstyle, function(e) {
			success(e.index - 1);
		});
		// #endif

		// #ifndef APP-PLUS
		let itemList = [];
		for (let i = 0; i < actionbuttons.length; i++) {
			itemList.push(actionbuttons[i].title);
		}
		uni.showActionSheet({
			title: title,
			itemList: itemList,
			cancelText: cancelText,
			success: (e) => {
				console.log(e.tapIndex);
				success(e.tapIndex);
			},
		});
		// #endif
	},

	printEmp(url, fileName, size) {
		empApi.openRemoteFile({
			name: fileName,       //文件名称
			type: "pdf",            //文件类型
			size: size,           //文件大小(字节)
			md5: "",          //对应文件md5值,同一文件md5值改变,会重新下载覆盖;
			fileUrl: url, //文件url下载地址
			success: function (res) {
				confirm(JSON.stringify(res));
			},
			error: function (error) {
				confirm(JSON.stringify(error));
			}
		});
	},
}


export default EMPAPP
